home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / recio202.zip / rbget.c < prev    next >
C/C++ Source or Header  |  1994-05-05  |  4KB  |  110 lines

  1. /*****************************************************************************
  2.    MODULE: rbget.c
  3.   PURPOSE: recio character delimited integral number input functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.02
  8.   RELEASE: May 5, 1994
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <limits.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. #include "recio.h"
  19.  
  20. extern int _rstatus(REC *rp, int mode);
  21. extern char *_rfldstr(REC *rp, size_t len);
  22. extern char *_rerrs(REC *rp, int errnum);
  23. extern unsigned long str2ul(const char *nptr, char **endptr, int base);
  24.  
  25. #define uint      unsigned int
  26. #define ulong     unsigned long
  27. #define UNSIGNED  0
  28. #define SIGNED    1
  29.  
  30. /****************************************************************************/
  31. static long                  /* return integral number                      */
  32.     _rbgetl(                 /* get integral number from record stream      */
  33.         REC *rp,             /* record pointer                              */
  34.         int base,            /* radix of number                             */
  35.         int sign,            /* signed number? (0=unsigned; !0=signed)      */
  36.         long min,            /* inclusive valid min value (0 if unsigned)   */
  37.         long max)            /* inclusive valid max value                   */
  38. /****************************************************************************/
  39.     long result=0L;          /* result to return */
  40.     long val;                /* conversion value */
  41.     char *fldptr;            /* pointer to field string */
  42.     char *endptr;            /* pointer to first invalid field char */
  43.  
  44.     if (!_rstatus(rp, R_READ)) { 
  45.       fldptr = _rfldstr(rp, 0); 
  46.       if (fldptr) { 
  47.         for (;;) { 
  48.           if (*fldptr != '\0') { 
  49.             endptr = fldptr; 
  50.             errno = 0; 
  51.             if (sign) {
  52.               val = strtol(fldptr, &endptr, base); 
  53.             } else {
  54.               val = str2ul(fldptr, &endptr, base); 
  55.             }
  56.             while (isspace(*endptr)) endptr++; 
  57.             if (errno==ERANGE || !*endptr) { 
  58.               if (!errno) { 
  59.                 if (sign) {
  60.                   if (val >= min && val <= max) { 
  61.                     result = val; 
  62.                     goto done; 
  63.                   }
  64.                 } else {
  65.                   /* note: unsigned min always assumed to be zero */
  66.                   if ((ulong) val <= (ulong) max) {
  67.                     result = val; 
  68.                     goto done;
  69.                   }
  70.                 }
  71.               } /* data out of range */ 
  72.               fldptr = _rerrs(rp, R_ERANGE); 
  73.               if (fldptr) { continue; } else { goto done; } 
  74.             } /* invalid data */ 
  75.             fldptr = _rerrs(rp, R_EINVDAT); 
  76.             if (fldptr) { continue; } else { goto done; } 
  77.           } /* missing data */ 
  78.           fldptr = _rerrs(rp, R_EMISDAT); 
  79.           if (fldptr) { continue; } else { goto done; } 
  80.         } 
  81.       }
  82.     }
  83. done:
  84.     return result;
  85. }
  86.  
  87. /****************************************************************************/
  88. /* character delimited integral number input functions                      */
  89. /****************************************************************************/
  90. int rbgeti(REC *rp, int base)
  91. {
  92.     return (int) _rbgetl(rp, base, SIGNED, INT_MIN, INT_MAX);
  93. }
  94.  
  95. unsigned int rbgetui(REC *rp, int base)
  96. {
  97.     return (uint) _rbgetl(rp, base, UNSIGNED, 0, UINT_MAX);
  98. }
  99.  
  100. long rbgetl(REC *rp, int base)
  101. {
  102.     return _rbgetl(rp, base, SIGNED, LONG_MIN, LONG_MAX);
  103. }
  104.  
  105. unsigned long rbgetul(REC *rp, int base)
  106. {
  107.     return (ulong) _rbgetl(rp, base, UNSIGNED, 0L, ULONG_MAX);
  108. }
  109.